package com.study.kt._01grammar._02oop

/*
*
*
* */
fun main() {
    //调用嵌套类方法, OutClass.InClass() 创建嵌套类对象
    OutClass.InClass().sayHello()

    //使用内部类，通过外部类的实例创建外部类
    var innerClazz = OutClass().InnerClass()
    innerClazz.sayName()
}

class OutClass {
    var name = "fauks"

    //嵌套类 该类默认为静态内部类，不依赖外部类，不能访问外部的字段或函数
    class InClass {
        fun sayHello() {
            println("hello")
        }
    }

    //内部类 使用inner修饰 相当于Java内部类，依赖外部类 可以访问外部类字段或函数
    inner class InnerClass {
        var name = "innerClass"
        fun sayName() {
            //使用this访问外部类字段
            //默认this是指InnerClass
            println(this.name) //innerClass
            //使用@OutClass指代外部类
            //kotlin中this没有限定具体指谁使用@XXX修改指向，java this永远指代当前对象
            println(this@OutClass.name) // fauks
        }
    }

    // 局部嵌套类，定义在方法的中的类
    fun getClazz() {
        class LocalNestedClass {
            val name: String = "slx"
        }
    }
}